home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / util / icontols / part02 < prev   
Internet Message Format  |  1990-07-15  |  44KB

  1. Path: xanth!cs.odu.edu!Amiga-Request
  2. From: Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v90i211: icontools - tools for managing icons under workbench, Part02/02
  5. Message-ID: <13132@xanth.cs.odu.edu>
  6. Date: 15 Jul 90 22:37:46 GMT
  7. Sender: tadguy@cs.odu.edu
  8. Reply-To: rich@californium.cchem.berkeley.ed (Rich Mazzarisi)
  9. Lines: 846
  10. Approved: tadguy@cs.odu.edu (Tad Guy)
  11. X-Mail-Submissions-To: Amiga@cs.odu.edu
  12. X-Post-Discussions-To: comp.sys.amiga
  13.  
  14. Submitted-by: rich@californium.cchem.berkeley.ed (Rich Mazzarisi)
  15. Posting-number: Volume 90, Issue 211
  16. Archive-name: util/icontools/part02
  17.  
  18. #!/bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 2 (of 2)."
  25. # Contents:  arp/ArpBase.j.aa
  26. # Wrapped by tadguy@xanth on Sun Jul 15 18:36:27 1990
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'arp/ArpBase.j.aa' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'arp/ArpBase.j.aa'\"
  30. else
  31. echo shar: Extracting \"'arp/ArpBase.j.aa'\" \(41051 characters\)
  32. sed "s/^X//" >'arp/ArpBase.j.aa' <<'END_OF_FILE'
  33. X\ ArpBase.j
  34. X\ AMIGA JForth Include file.
  35. X\
  36. X\ converted 11/24/89 by R. Mazzarisi using the H2J program by Phil Burke from
  37. X\    the JForth Goodies #1 package
  38. X\ lines which were unconvertable by the program, which I attempted to
  39. X\    convert are marked "correct below? -RM"
  40. X\
  41. X\ 11/24/89 the only parts tested are the data structures for opening the
  42. X\        library and for the functions ArpAllocFreq and FileRequest
  43. X\
  44. Xinclude? :struct ju:c_struct
  45. Xdecimal
  46. XEXISTS? LIBRARIES_ARPBASE_H NOT .IF
  47. X1   constant LIBRARIES_ARPBASE_H
  48. X.THEN    \ %? Forced .THEN to prevent nesting!!!
  49. X
  50. X( )
  51. X(  ************************************************************************)
  52. X(  *                                                                    *)
  53. X(  * 5/3/89     ARPbase.h       by MKSoft from ARPbase.i by SDB         *)
  54. X(  *                                                                    *)
  55. X(  ************************************************************************)
  56. X(  *                                                                    *)
  57. X(  *    AmigaDOS Resource Project -- Library Include File               *)
  58. X(  *                                 for Lattice C 5.x or Manx C 3.6    *)
  59. X(  *                                                                    *)
  60. X(  ************************************************************************)
  61. X(  *                                                                    *)
  62. X(  *    Copyright [c] 1987/1988/1989 by Scott Ballantyne                *)
  63. X(  *                                                                    *)
  64. X(  *    The arp.library, and related code and files may be freely used  *)
  65. X(  *    by supporters of ARP.  Modules in the arp.library may not be    *)
  66. X(  *    extracted for use in independent code, but you are welcome to   *)
  67. X(  *    provide the arp.library with your work and call on it freely.   *)
  68. X(  *                                                                    *)
  69. X(  *    You are equally welcome to add new functions, improve the ones  *)
  70. X(  *    within, or suggest additions.                                   *)
  71. X(  *                                                                    *)
  72. X(  *    BCPL programs are not welcome to call on the arp.library.       *)
  73. X(  *    The welcome mat is out to all others.                           *)
  74. X(  *                                                                    *)
  75. X(  ************************************************************************)
  76. X(  *                                                                    *)
  77. X(  * N O T E !  You MUST! have IoErr[] defined as LONG to use LastTracker *)
  78. X(  *          If your compiler has other defines for this, you may wish *)
  79. X(  *          to remove the prototype for IoErr[] from this file.       *)
  80. X(  *                                                                    *)
  81. X(  ************************************************************************)
  82. X(  )
  83. X
  84. X( )
  85. X(  ************************************************************************)
  86. X(  *    First we need to include the Amiga Standard Include files...    *)
  87. X(  ************************************************************************)
  88. X(  )
  89. X
  90. XEXISTS? EXEC_TYPES_H NOT .IF
  91. Xinclude ji:EXEC/Types.j
  92. X.THEN
  93. X
  94. XEXISTS? EXEC_LISTS_H NOT .IF
  95. Xinclude ji:EXEC/Lists.j
  96. X.THEN
  97. X
  98. XEXISTS? EXEC_ALERTS_H NOT .IF
  99. Xinclude ji:EXEC/Alerts.j
  100. X.THEN
  101. X
  102. XEXISTS? EXEC_LIBRARIES_H NOT .IF
  103. Xinclude ji:EXEC/Libraries.j
  104. X.THEN
  105. X
  106. XEXISTS? EXEC_SEMAPHORES_H NOT .IF
  107. Xinclude ji:EXEC/Semaphores.j
  108. X.THEN
  109. X
  110. XEXISTS? LIBRARIES_DOS_H NOT .IF
  111. Xinclude ji:Libraries/DOS.j
  112. X.THEN
  113. X
  114. X( )
  115. X(  ************************************************************************)
  116. X(  *    Standard definitions for arp library information                *)
  117. X(  ************************************************************************)
  118. X(  )
  119. X0" arp.library"  0string ArpName  ( Name of library... )
  120. X39   constant ArpVersion (  Current version... )
  121. X
  122. X( )
  123. X(  ************************************************************************)
  124. X(  *    The current ARP library node...                                 *)
  125. X(  ************************************************************************)
  126. X(  )
  127. X
  128. X:STRUCT ArpBase
  129. X      STRUCT Library    ab_LibNode     (  Standard library node               )
  130. X          APTR ab_DosRootNode     (  Copy of dl_Root                     )
  131. X          UBYTE ab_Flags         (  See bitdefs below                   )
  132. X          UBYTE ab_ESCChar     (  Character to be used for escaping   )
  133. X          LONG ab_ArpReserved1     (  ArpLib's use only!!                 )
  134. X      APTR ab_EnvBase     (  Dummy library for MANX compatibility)
  135. X      APTR ab_DosBase     (  Cached DosBase                      )
  136. X      APTR ab_GfxBase     (  Cached GfxBase                      )
  137. X      APTR ab_IntuiBase     (  Cached IntuitionBase                )
  138. X      STRUCT MinList    ab_ResLists     (  Resource trackers                   )
  139. X      APTR ab_ResidentPrgList     (  Resident Programs.                  )
  140. X      STRUCT SignalSemaphore    ab_ResPrgProtection (  protection for above              )
  141. X          LONG ab_SegList     (  Pointer to loaded libcode [a BPTR]. )
  142. X        ;STRUCT
  143. X
  144. X
  145. X( )
  146. X(  ************************************************************************)
  147. X(  *    The following is here *ONLY* for information and for            *)
  148. X(  *    compatibility with MANX.  DO NOT use in new code!               *)
  149. X(  ************************************************************************)
  150. X(  )
  151. XEXISTS? ARP_PRIVATE .IF
  152. X
  153. X:STRUCT EnvBase
  154. X      STRUCT Library    eb_LibNode    (  Standard library node for linkage    )
  155. X          APTR eb_EnvSpace    (  Access only when Forbidden!          )
  156. X          ULONG eb_EnvSize    (  Total allocated mem for EnvSpace     )
  157. X      APTR eb_ArpBase    (  Added in V32 for Resource Tracking   )
  158. X        ;STRUCT
  159. X
  160. X.THEN
  161. X
  162. X( )
  163. X(  ************************************************************************)
  164. X(  *    These are used in release 33.4 but not by the library code.     *)
  165. X(  *    Instead, individual programs check for these flags.             *)
  166. X(  ************************************************************************)
  167. X(  )
  168. X0   constant ARPB_WILD_WORLD    ( Mixed BCPL/Normal wildcards. )
  169. X1   constant ARPB_WILD_BCPL    ( Pure BCPL wildcards. )
  170. X
  171. X1  ARPB_WILD_WORLD <<  constant ARPF_WILD_WORLD
  172. X1  ARPB_WILD_BCPL <<  constant ARPF_WILD_BCPL
  173. X
  174. X( )
  175. X(  ************************************************************************)
  176. X(  * The alert object is what you use if you really must return an alert        *)
  177. X(  * to the user. You would normally OR this with another alert number  *)
  178. X(  * from the alerts.h file. Generally, should be NON deadend alerts.   *)
  179. X(  *                                                                    *)
  180. X(  * For example, if you can't open ArpLibrary:                         *)
  181. X(  *    Alert[ [AG_OpenLib|AO_ArpLib], 0L];                             *)
  182. X(  ************************************************************************)
  183. X(  )
  184. X$ 00008036   constant AO_ArpLib (  Alert object )
  185. X
  186. X( )
  187. X(  ************************************************************************)
  188. X(  *    Alerts that arp.library may return...                           *)
  189. X(  ************************************************************************)
  190. X(  )
  191. X$ 03600000   constant AN_ArpLib (  Alert number                              )
  192. X$ 03610000   constant AN_ArpNoMem (  No more memory                  )
  193. X$ 03610002   constant AN_ArpInputMem (  No memory for input buffer           )
  194. X$ 83610003   constant AN_ArpNoMakeEnv (  No memory to make EnvLib            )
  195. X
  196. X$ 83630001   constant AN_ArpNoDOS (  Can't open dos.library          )
  197. X$ 83630002   constant AN_ArpNoGfx (  Can't open graphics.library             )
  198. X$ 83630003   constant AN_ArpNoIntuit (  Can't open intuition                 )
  199. X$ 83640000   constant AN_BadPackBlues (  Bad packet returned to SendPacket[] )
  200. X$ 83600003   constant AN_Zombie (  Zombie roaming around system              )
  201. X
  202. X$ 83600002   constant AN_ArpScattered (  Scatter loading not allowed for arp )
  203. X
  204. X
  205. X( )
  206. X(  ************************************************************************)
  207. X(  *    Return codes you can get from calling ARP Assign[]...           *)
  208. X(  ************************************************************************)
  209. X(  )
  210. X0   constant ASSIGN_OK (  Everything is cool and groovey                     )
  211. X1   constant ASSIGN_NODEV (  "Physical" is not valid for assignment          )
  212. X2   constant ASSIGN_FATAL (  Something really icky happened                  )
  213. X3   constant ASSIGN_CANCEL (  Tried to cancel something but it won't cancel  )
  214. X
  215. X( )
  216. X(  ************************************************************************)
  217. X(  *    Size of buffer you need if you are going to call ReadLine[]     *)
  218. X(  ************************************************************************)
  219. X(  )
  220. X256   constant MaxInputBuf
  221. X
  222. X( )
  223. X(  ************************************************************************)
  224. X(  *    The ARP file requester data structure...                        *)
  225. X(  ************************************************************************)
  226. X(  )
  227. X
  228. X:STRUCT FileRequester
  229. X              APTR fr_Hail             (  Hailing text                 )
  230. X              APTR fr_File             (  Filename array [FCHARS + 1]  )
  231. X              APTR fr_Dir             (  Directory array [DSIZE + 1]  )
  232. X              APTR fr_Window         (  Window requesting or NULL    )
  233. X              UBYTE fr_FuncFlags         (  Set bitdef's below           )
  234. X              UBYTE fr_Flags2         (  New flags...                 )
  235. X\ %? correct below? -RM   VOID      (*fr_Function)();       /* Your function, see bitdef's  */
  236. X              APTR    fr_Function()        (  Your function, see bitdef's  )
  237. X              SHORT fr_LeftEdge         (  To be used later...          )
  238. X              SHORT fr_TopEdge
  239. X            ;STRUCT
  240. X
  241. X
  242. X( )
  243. X(  ************************************************************************)
  244. X(  * The following are the defines for fr_FuncFlags.  These bits tell   *)
  245. X(  * FileRequest[] what your fr_UserFunc is expecting, and what         *)
  246. X(  * FileRequest[] should call it for.                                  *)
  247. X(  *                                                                    *)
  248. X(  * You are called like so:                                            *)
  249. X(  * fr_Function[Mask, Object]                                          *)
  250. X(  * ULONG      Mask;                                                   *)
  251. X(  * CPTR               *Object;                                                *)
  252. X(  *                                                                    *)
  253. X(  * The Mask is a copy of the flag value that caused FileRequest[] to  *)
  254. X(  * call your function. You can use this to determine what action you  *)
  255. X(  * need to perform, and exactly what Object is, so you know what to do        *)
  256. X(  * and what to return.                                                        *)
  257. X(  ************************************************************************)
  258. X(  )
  259. X7   constant FRB_DoWildFunc (  Call me with a FIB and a name, ZERO return accepts.   )
  260. X6   constant FRB_DoMsgFunc (  You get all IDCMP messages not for FileRequest[]               )
  261. X5   constant FRB_DoColor (  Set this bit for that new and different look             )
  262. X4   constant FRB_NewIDCMP (  Force a new IDCMP [only if fr_Window != NULL]           )
  263. X3   constant FRB_NewWindFunc (  You get to modify the newwindow structure.           )
  264. X2   constant FRB_AddGadFunc (  You get to add gadgets.                                       )
  265. X1   constant FRB_GEventFunc (  Function to call if one of your gadgets is selected.  )
  266. X0   constant FRB_ListFunc (  Not implemented yet.                                    )
  267. X
  268. X1  FRB_DoWildFunc <<  constant FRF_DoWildFunc
  269. X1  FRB_DoMsgFunc <<  constant FRF_DoMsgFunc
  270. X1  FRB_DoColor <<  constant FRF_DoColor
  271. X1  FRB_NewIDCMP <<  constant FRF_NewIDCMP
  272. X1  FRB_NewWindFunc <<  constant FRF_NewWindFunc
  273. X1  FRB_AddGadFunc <<  constant FRF_AddGadFunc
  274. X1  FRB_GEventFunc <<  constant FRF_GEventFunc
  275. X1  FRB_ListFunc <<  constant FRF_ListFunc
  276. X
  277. X( )
  278. X(  ************************************************************************)
  279. X(  * The FR2B_ bits are for fr_Flags2 in the file requester structure   *)
  280. X(  ************************************************************************)
  281. X(  )
  282. X0   constant FR2B_LongPath (  Specify the fr_Dir buffer is 256 bytes long )
  283. X
  284. X1  FR2B_LongPath <<  constant FR2F_LongPath
  285. X
  286. X( )
  287. X(  ************************************************************************)
  288. X(  *    The sizes of the different buffers...                           *)
  289. X(  ************************************************************************)
  290. X(  )
  291. X32   constant FCHARS (  Filename size                                )
  292. X33   constant DSIZE (  Directory name size if not FR2B_LongPath      )
  293. X
  294. X254   constant LONG_DSIZE (  If FR2B_LongPath is set, use LONG_DSIZE )
  295. X126   constant LONG_FSIZE (  For compatibility with ARPbase.i                )
  296. X
  297. X$ 7680     constant FR_FIRST_GADGET (  User gadgetID's must be less than this value    )
  298. X
  299. X( )
  300. X(  ************************************************************************)
  301. X(  * Structure expected by FindFirst[]/FindNext[]                               *)
  302. X(  *                                                                    *)
  303. X(  * You need to allocate this structure and initialize it as follows:  *)
  304. X(  *                                                                    *)
  305. X(  * Set ap_BreakBits to the signal bits [CDEF] that you want to take a *)
  306. X(  * break on, or NULL, if you don't want to convenience the user.      *)
  307. X(  *                                                                    *)
  308. X(  * if you want to have the FULL PATH NAME of the files you found,     *)
  309. X(  * allocate a buffer at the END of this structure, and put the size of        *)
  310. X(  * it into ap_StrLen.  If you don't want the full path name, make sure        *)
  311. X(  * you set ap_StrLen to zero.  In this case, the name of the file, and        *)
  312. X(  * stats are available in the ap_Info, as per usual.                  *)
  313. X(  *                                                                    *)
  314. X(  * Then call FindFirst[] and then afterwards, FindNext[] with this    *)
  315. X(  * structure.  You should check the return value each time [see below]        *)
  316. X(  * and take the appropriate action, ultimately calling                        *)
  317. X(  * FreeAnchorChain[] when there are no more files and you are done.   *)
  318. X(  * You can tell when you are done by checking for the normal AmigaDOS *)
  319. X(  * return code ERROR_NO_MORE_ENTRIES.                                 *)
  320. X(  *                                                                    *)
  321. X(  * You will also have to check the DirEntryType variable in the ap_Info       *)
  322. X(  * structure to determine what exactly you have received.             *)
  323. X(  ************************************************************************)
  324. X(  )
  325. X
  326. X:STRUCT AnchorPath
  327. X          APTR ap_Base         (  Pointer to first anchor                      )
  328. X          APTR ap_Last         (  Pointer to last anchor                       )
  329. X              LONG ap_BreakBits  (  Bits to break on                             )
  330. X              LONG ap_FoundBreak (  Bits we broke on. Also returns ERROR_BREAK   )
  331. X              BYTE ap_Flags      (  New use for the extra word...                )
  332. X              BYTE ap_Reserved   (  To fill it out...                            )
  333. X              SHORT ap_StrLen    (  This is what used to be ap_Length            )
  334. X          STRUCT FileInfoBlock    ap_Info
  335. X            ( %?)   1 BYTES ap_Buf       (  Allocate a buffer here, if desired           )
  336. X            ;STRUCT
  337. X
  338. X
  339. X( )
  340. X(  ************************************************************************)
  341. X(  *    Bit definitions for the new ap_Flags...                         *)
  342. X(  ************************************************************************)
  343. X(  )
  344. X0   constant APB_DoWild (  User option ALL                           )
  345. X1   constant APB_ItsWild (  Set by FindFirst, used by FindNext               )
  346. X2   constant APB_DoDir (  Bit is SET if a DIR node should be entered )
  347. X                (  Application can RESET this bit to AVOID      )
  348. X                (  entering a dir.                              )
  349. X3   constant APB_DidDir (  Bit is set for an "expired" dir node              )
  350. X4   constant APB_NoMemErr (  Set if there was not enough memory              )
  351. X5   constant APB_DoDot (  If set, '.' [DOT] will convert to CurrentDir       )
  352. X
  353. X1  APB_DoWild <<  constant APF_DoWild
  354. X1  APB_ItsWild <<  constant APF_ItsWild
  355. X1  APB_DoDir <<  constant APF_DoDir
  356. X1  APB_DidDir <<  constant APF_DidDir
  357. X1  APB_NoMemErr <<  constant APF_NoMemErr
  358. X1  APB_DoDot <<  constant APF_DoDot
  359. X
  360. X( )
  361. X(  ************************************************************************)
  362. X(  * Structure used by the pattern matching functions, no need to obtain,       *)
  363. X(  * diddle or allocate this yourself.                                  *)
  364. X(  *                                                                    *)
  365. X(  * Note:  If you did, you will now break as it has changed...         *)
  366. X(  ************************************************************************)
  367. X(  )
  368. XEXISTS? ARP_PRIVATE .IF
  369. X
  370. X:STRUCT AChain
  371. X      APTR an_Child
  372. X      APTR an_Parent
  373. X      APTR an_Lock
  374. X      APTR an_Info
  375. X          BYTE an_Flags
  376. X        ( %?)   1 BYTES an_String       (  Just as is .i file   )
  377. X        ;STRUCT
  378. X                (  ???  Don't use this! )
  379. X.THEN
  380. X
  381. X0   constant DDB_PatternBit
  382. X1   constant DDB_ExaminedBit
  383. X2   constant DDB_Completed
  384. X3   constant DDB_AllBit
  385. X
  386. X1  DDB_PatternBit <<  constant DDF_PatternBit
  387. X1  DDB_ExaminedBit <<  constant DDF_ExaminedBit
  388. X1  DDB_Completed <<  constant DDF_Completed
  389. X1  DDB_AllBit <<  constant DDF_AllBit
  390. X
  391. X( )
  392. X(  ************************************************************************)
  393. X(  * This structure takes a pointer, and returns FALSE if wildcard was  *)
  394. X(  * not found by FindFirst[]                                           *)
  395. X(  ************************************************************************)
  396. X(  )
  397. X\ %? #define    IsWild( ptr )           ( *((LONG *)(ptr)) ): IsWild ;
  398. X
  399. X( )
  400. X(  ************************************************************************)
  401. X(  * Constants used by wildcard routines                                        *)
  402. X(  *                                                                    *)
  403. X(  * These are the pre-parsed tokens referred to by pattern match.  It  *)
  404. X(  * is not necessary for you to do anything about these, FindFirst[]   *)
  405. X(  * FindNext[] handle all these for you.                                       *)
  406. X(  ************************************************************************)
  407. X(  )
  408. X$ 80   constant P_ANY (  Token for '*' | '#?'        )
  409. X$ 81   constant P_SINGLE (  Token for '?'    )
  410. X
  411. X( )
  412. X(  ************************************************************************)
  413. X(  * No need to muck with these as they may change...                   *)
  414. X(  ************************************************************************)
  415. X(  )
  416. XEXISTS? ARP_PRIVATE .IF
  417. X$ 82   constant P_ORSTART (  Token for '['   )
  418. X$ 83   constant P_ORNEXT (  Token for '|'    )
  419. X$ 84   constant P_OREND (  Token for ']'     )
  420. X$ 85   constant P_NOT (  Token for '~'       )
  421. X$ 87   constant P_NOTCLASS (  Token for '^'  )
  422. X$ 88   constant P_CLASS (  Token for '[]'    )
  423. X$ 89   constant P_REPBEG (  Token for '['    )
  424. X$ 8A   constant P_REPEND (  Token for ']'    )
  425. X.THEN
  426. X
  427. X( )
  428. X(  ************************************************************************)
  429. X(  * Structure used by AddDANode[], AddDADevs[], FreeDAList[].          *)
  430. X(  *                                                                    *)
  431. X(  * This structure is used to create lists of names, which normally    *)
  432. X(  * are devices, assigns, volumes, files, or directories.              *)
  433. X(  ************************************************************************)
  434. X(  )
  435. X
  436. X:STRUCT DirectoryEntry
  437. X          APTR de_Next    (  Next in list                         )
  438. X              BYTE de_Type    (  DLX_mumble                           )
  439. X              BYTE de_Flags (  For future expansion, DO NOT USE!    )
  440. X            ( %?)   1 BYTES de_Name (  The name of the thing found          )
  441. X            ;STRUCT
  442. X
  443. X
  444. X( )
  445. X(  ************************************************************************)
  446. X(  * Defines you use to get a list of the devices you want to look at.  *)
  447. X(  * For example, to get a list of all directories and volumes, do:     *)
  448. X(  *                                                                    *)
  449. X(  *    AddDADevs[ mydalist, [DLF_DIRS | DLF_VOLUMES] ]                 *)
  450. X(  *                                                                    *)
  451. X(  * After this, you can examine the de_type field of the elements added        *)
  452. X(  * to your list [if any] to discover specifics about the objects added.       *)
  453. X(  *                                                                    *)
  454. X(  * Note that if you want only devices which are also disks, you must  *)
  455. X(  * [DLF_DEVICES | DLF_DISKONLY].                                      *)
  456. X(  ************************************************************************)
  457. X(  )
  458. X0   constant DLB_DEVICES (  Return devices                           )
  459. X1   constant DLB_DISKONLY (  Modifier for above: Return disk devices only    )
  460. X2   constant DLB_VOLUMES (  Return volumes only                              )
  461. X3   constant DLB_DIRS (  Return assigned devices only                        )
  462. X
  463. X1  DLB_DEVICES <<  constant DLF_DEVICES
  464. X1  DLB_DISKONLY <<  constant DLF_DISKONLY
  465. X1  DLB_VOLUMES <<  constant DLF_VOLUMES
  466. X1  DLB_DIRS <<    constant DLF_DIRS
  467. X
  468. X( )
  469. X(  ************************************************************************)
  470. X(  * Legal de_Type values, check for these after a call to AddDADevs[], *)
  471. X(  * or use on your own as the ID values in AddDANode[].                        *)
  472. X(  ************************************************************************)
  473. X(  )
  474. X0   constant DLX_FILE (  AddDADevs[] can't determine this    )
  475. X8   constant DLX_DIR (  AddDADevs[] can't determine this     )
  476. X16   constant DLX_DEVICE (  It's a resident device           )
  477. X
  478. X24   constant DLX_VOLUME (  Device is a volume                       )
  479. X32   constant DLX_UNMOUNTED (  Device is not resident                )
  480. X
  481. X40   constant DLX_ASSIGN (  Device is a logical assignment   )
  482. X
  483. X( )
  484. X(  ************************************************************************)
  485. X(  *    This macro is to check for an error return from the Atol[]      *)
  486. X(  *    routine.  If Errno is ERRBADINT, then there was an error...     *)
  487. X(  *    This was done to try to remain as close to source compatible    *)
  488. X(  *    as possible with the older [rel 1.1] ARPbase.h                  *)
  489. X(  ************************************************************************)
  490. X(  )
  491. X1   constant ERRBADINT
  492. X\ %? #define Errno         (IoErr() ? ERRBADINT : 0)
  493. X
  494. X( )
  495. X(  ************************************************************************)
  496. X(  *    Resource Tracking stuff...                                      *)
  497. X(  ************************************************************************)
  498. X(  *                                                                    *)
  499. X(  * There are a few things in arp.library that are only directly               *)
  500. X(  * acessable from assembler.  The glue routines provided by us for    *)
  501. X(  * all 'C' compilers use the following conventions to make these      *)
  502. X(  * available to C programs.  The glue for other language's should use *)
  503. X(  * as similar a mechanism as possible, so that no matter what language        *)
  504. X(  * or compiler we speak, when talk about arp, we will know what the   *)
  505. X(  * other guy is saying.                                                       *)
  506. X(  *                                                                    *)
  507. X(  * Here are the cases:                                                        *)
  508. X(  *                                                                    *)
  509. X(  * Tracker calls...                                                   *)
  510. X(  *            These calls return the Tracker pointer as a secondary   *)
  511. X(  *            result in the register A1.  For C, there is no clean    *)
  512. X(  *            way to return more than one result so the tracker       *)
  513. X(  *            pointer is returned in IoErr[].  For ease of use,       *)
  514. X(  *            there is a define that typecasts IoErr[] to the correct *)
  515. X(  *            pointer type.  This is called LastTracker and should    *)
  516. X(  *            be source compatible with the earlier method of storing *)
  517. X(  *            the secondary result.                                   *)
  518. X(  *                                                                    *)
  519. X(  * GetTracker[] -                                                     *)
  520. X(  *            Syntax is a bit different for C than the assembly call  *)
  521. X(  *            The C syntax is GetTracker[ID].  The binding routines   *)
  522. X(  *            will store the ID into the tracker on return.  Also,    *)
  523. X(  *            in an effort to remain consistant, the tracker will     *)
  524. X(  *            also be stored in LastTracker.                          *)
  525. X(  *                                                                    *)
  526. X(  * In cases where you have allocated a tracker before you have obtained       *)
  527. X(  * a resource [usually the most efficient method], and the resource has       *)
  528. X(  * not been obtained, you will need to clear the tracker id.  The macro       *)
  529. X(  * CLEAR_ID[] has been provided for that purpose.  It expects a pointer       *)
  530. X(  * to a DefaultTracker sort of struct.                                        *)
  531. X(  ************************************************************************)
  532. X(  )
  533. X\ %? #define    CLEAR_ID(t)     ((SHORT *) t)[-1]=NULL: CLEAR_ID ;
  534. X
  535. X( )
  536. X(  ************************************************************************)
  537. X(  * You MUST prototype IoErr[] to prevent the possible error in defining       *)
  538. X(  * IoErr[] and thus causing LastTracker to give you trash...          *)
  539. X(  *                                                                    *)
  540. X(  * N O T E !  You MUST! have IoErr[] defined as LONG to use LastTracker *)
  541. X(  *          If your compiler has other defines for this, you may wish *)
  542. X(  *          to remove the prototype for IoErr[].                      *)
  543. X(  ************************************************************************)
  544. X(  )
  545. X\ %? #define LastTracker     ((struct DefaultTracker *)IoErr())
  546. X
  547. X( )
  548. X(  ************************************************************************)
  549. X(  * The rl_FirstItem list [ResList] is a list of TrackedResource [below]       *)
  550. X(  * It is very important that nothing in this list depend on the task  *)
  551. X(  * existing at resource freeing time [i.e., RemTask[0L] type stuff,   *)
  552. X(  * DeletePort[] and the rest].                                                *)
  553. X(  *                                                                    *)
  554. X(  * The tracking functions return a struct Tracker *Tracker to you, this       *)
  555. X(  * is a pointer to whatever follows the tr_ID variable.                       *)
  556. X(  * The default case is reflected below, and you get it if you call    *)
  557. X(  * GetTracker[] [ see DefaultTracker below].                          *)
  558. X(  *                                                                    *)
  559. X(  * NOTE: The two user variables mentioned in an earlier version don't *)
  560. X(  * exist, and never did. Sorry about that [SDB].                      *)
  561. X(  *                                                                    *)
  562. X(  * However, you can still use ArpAlloc[] to allocate your own tracking        *)
  563. X(  * nodes and they can be any size or shape you like, as long as the   *)
  564. X(  * base structure is preserved. They will be freed automagically just *)
  565. X(  * like the default trackers.                                         *)
  566. X(  ************************************************************************)
  567. X(  )
  568. X
  569. X:STRUCT TrackedResource
  570. X          STRUCT MinNode    tr_Node (  Double linked pointer                )
  571. X              BYTE tr_Flags (  Don't touch                          )
  572. X              BYTE tr_Lock    (  Don't touch, for Get/FreeAccess[]    )
  573. X              SHORT tr_ID        (  Item's ID                            )
  574. X
  575. X( )
  576. X(  ************************************************************************)
  577. X(  * The struct DefaultTracker *Tracker portion of the structure.               *)
  578. X(  * The stuff below this point can conceivably vary, depending         *)
  579. X(  * on user needs, etc.  This reflects the default.                    *)
  580. X(  ************************************************************************)
  581. X(  )
  582. X            union{
  583. X\ %? correct below? -RM     CPTR    tr_Resource;    /* Whatever                */
  584. X                APTR    tr_Resource    (  Whatever                             )
  585. X            }union{
  586. X                  LONG tg_Verify    (  For use during TRAK_GENERIC          )
  587. X                }union    \ tr_Object;      /* The thing being tracked          */
  588. X            union{
  589. X\ %? correct below? -RM     VOID    (*tg_Function)();/* Function to call for TRAK_GENERIC   */
  590. X                APTR    tg_Function()  ( Function to call for TRAK_GENERIC   )
  591. X            }union{
  592. X              APTR tr_Window2    (  For TRAK_WINDOW                      )
  593. X                }union    \ tr_Extra;      /* Only needed sometimes         */
  594. X            ;STRUCT
  595. X
  596. X
  597. X\ %? #define tg_Value tg_Verify      /* Ancient compatibility only!  Do NOT use in new CODE!!! */
  598. X
  599. X( )
  600. X(  ************************************************************************)
  601. X(  * You get a pointer to a struct of the following type when you call  *)
  602. X(  * GetTracker[].  You can change this, and use ArpAlloc[] instead of  *)
  603. X(  * GetTracker[] to do tracking. Of course, you have to take a wee bit *)
  604. X(  * more responsibility if you do, as well as if you use TRAK_GENERIC  *)
  605. X(  * stuff.                                                             *)
  606. X(  *                                                                    *)
  607. X(  * TRAK_GENERIC folks need to set up a task function to be called when        *)
  608. X(  * an item is freed.  Some care is required to set this up properly.  *)
  609. X(  *                                                                    *)
  610. X(  * Some special cases are indicated by the unions below, for          *)
  611. X(  * TRAK_WINDOW, if you have more than one window opened, and don't    *)
  612. X(  * want the IDCMP closed particularly, you need to set a ptr to the   *)
  613. X(  * other window in dt_Window2.  See CloseWindowSafely[] for more info.        *)
  614. X(  * If only one window, set this to NULL.                              *)
  615. X(  ************************************************************************)
  616. X(  )
  617. X
  618. X:STRUCT DefaultTracker
  619. X            union{
  620. X\ %? correct below? -RM     CPTR    dt_Resource;    /* Whatever                */
  621. X                APTR    dt_Resource    (  Whatever                             )
  622. X            }union{
  623. X                  LONG tg_Verify    (  For use during TRAK_GENERIC          )
  624. X                }union    \ dt_Object;      /* The object being tracked          */
  625. X            union{
  626. X\ %? correct below? -RM     VOID    (*tg_Function)();/* Function to call for TRAK_GENERIC   */
  627. X                APTR    tg_Function()  ( Function to call for TRAK_GENERIC    )
  628. X            }union{
  629. X              APTR dt_Window2    (  For TRAK_WINDOW                      )
  630. X                }union    \ dt_Extra;
  631. X            ;STRUCT
  632. X
  633. X
  634. X( )
  635. X(  ************************************************************************)
  636. X(  *    Items the tracker knows what to do about                        *)
  637. X(  ************************************************************************)
  638. X(  )
  639. X0   constant TRAK_AAMEM (  Default [ArpAlloc] element                )
  640. X1   constant TRAK_LOCK (  File lock                          )
  641. X2   constant TRAK_FILE (  Opened file                                )
  642. X3   constant TRAK_WINDOW (  Window -- see docs                       )
  643. X4   constant TRAK_SCREEN (  Screen                           )
  644. X5   constant TRAK_LIBRARY (  Opened library                  )
  645. X6   constant TRAK_DAMEM (  Pointer to DosAllocMem block              )
  646. X7   constant TRAK_MEMNODE (  AllocEntry[] node                       )
  647. X8   constant TRAK_SEGLIST (  Program segment                 )
  648. X9   constant TRAK_RESLIST (  ARP [nested] ResList                    )
  649. X10   constant TRAK_MEM (  Memory ptr/length                  )
  650. X11   constant TRAK_GENERIC (  Generic Element, your choice           )
  651. X12   constant TRAK_DALIST (  DAlist [ aka file request ]             )
  652. X13   constant TRAK_ANCHOR (  Anchor chain [pattern matching] )
  653. X14   constant TRAK_FREQ (  FileRequest struct                        )
  654. X15   constant TRAK_FONT (  GfxBase CloseFont[]                       )
  655. X15   constant TRAK_MAX (  Poof, anything higher is tossed    )
  656. X
  657. X7   constant TRB_UNLINK (  Free node bit                     )
  658. X6   constant TRB_RELOC (  This may be relocated [not used yet]       )
  659. X5   constant TRB_MOVED (  Item moved                         )
  660. X
  661. X1  TRB_UNLINK <<  constant TRF_UNLINK
  662. X1  TRB_RELOC <<  constant TRF_RELOC
  663. X1  TRB_MOVED <<  constant TRF_MOVED
  664. X
  665. X( )
  666. X(  ************************************************************************)
  667. X(  * Note: ResList MUST be a DosAllocMem'ed list!, this is done for     *)
  668. X(  * you when you call CreateTaskResList[], typically, you won't need   *)
  669. X(  * to access/allocate this structure.                                 *)
  670. X(  ************************************************************************)
  671. X(  )
  672. X
  673. X:STRUCT ResList
  674. X      STRUCT MinNode    rl_Node (  Used by arplib to link reslists      )
  675. X      APTR rl_TaskID    (  Owner of this list                   )
  676. X      STRUCT MinList    rl_FirstItem    (  List of Tracked Resources            )
  677. X      APTR rl_Link    (  SyncRun's use - hide list here       )
  678. X        ;STRUCT
  679. X
  680. X
  681. X( )
  682. X(  ************************************************************************)
  683. X(  *    Returns from CompareLock[]                                      *)
  684. X(  ************************************************************************)
  685. X(  )
  686. X0   constant LCK_EQUAL (  The two locks refer to the same object     )
  687. X1   constant LCK_VOLUME (  Locks are on the same volume                      )
  688. X2   constant LCK_DIFVOL1 (  Locks are on different volumes           )
  689. X3   constant LCK_DIFVOL2 (  Locks are on different volumes           )
  690. X
  691. X( )
  692. X(  ************************************************************************)
  693. X(  *    ASyncRun[] stuff...                                             *)
  694. X(  ************************************************************************)
  695. X(  * Message sent back on your request by an exiting process.           *)
  696. X(  * You request this by putting the address of your message in         *)
  697. X(  * pcb_LastGasp, and initializing the ReplyPort variable of your      *)
  698. X(  * ZombieMsg to the port you wish the message posted to.              *)
  699. X(  ************************************************************************)
  700. X(  )
  701. X
  702. X:STRUCT ZombieMsg
  703. X          STRUCT Message    zm_ExecMessage
  704. X              ULONG zm_TaskNum    (  Task ID                      )
  705. X              LONG zm_ReturnCode    (  Process's return code        )
  706. X              ULONG zm_Result2    (  System return code           )
  707. X          STRUCT DateStamp    zm_ExitTime    (  Date stamp at time of exit   )
  708. X              ULONG zm_UserInfo    (  For whatever you wish        )
  709. X            ;STRUCT
  710. X
  711. X
  712. X( )
  713. X(  ************************************************************************)
  714. X(  * Structure required by ASyncRun[] -- see docs for more info.                *)
  715. X(  ************************************************************************)
  716. X(  )
  717. X
  718. X:STRUCT ProcessControlBlock
  719. X                  ULONG pcb_StackSize    (  Stacksize for new process                    )
  720. X                  BYTE pcb_Pri    (  Priority of new task                         )
  721. X                  UBYTE pcb_Control    (  Control bits, see defines below              )
  722. X                  APTR pcb_TrapCode    (  Optional Trap Code                           )
  723. X                  LONG pcb_Input
  724. X                  LONG pcb_Output    (  Optional stdin, stdout                       )
  725. X                union{
  726. X                      LONG pcb_SplatFile    (  File to use for Open["*"]                    )
  727. X                }union{
  728. X                      APTR pcb_ConName    (  CON: filename                                )
  729. X                    }union    \ pcb_Console;
  730. X\ %?                CPTR        pcb_LoadedCode; /* If not null, will not load/unload code    */
  731. X                APTR        pcb_LoadedCode    (  If not null, will not load/unload code       )
  732. X              APTR pcb_LastGasp    (  ReplyMsg[] to be filled in by exit           )
  733. X              APTR pcb_WBProcess    (  Valid only when PRB_NOCLI                    )
  734. X                ;STRUCT
  735. X
  736. X
  737. X( )
  738. X(  ************************************************************************)
  739. X(  * Formerly needed to pass NULLCMD to a child.  No longer needed.     *)
  740. X(  * It is being kept here for compatibility only...                    *)
  741. X(  ************************************************************************)
  742. X(  )
  743. X\ %? #define    NOCMD    "\n"
  744. X
  745. X( )
  746. X(  ************************************************************************)
  747. X(  * The following control bits determine what ASyncRun[] does on               *)
  748. X(  * Abnormal Exits and on background process termination.              *)
  749. X(  ************************************************************************)
  750. X(  )
  751. X0   constant PRB_SAVEIO (  Don't free/check file handles on exit     )
  752. X1   constant PRB_CLOSESPLAT (  Close Splat file, must request explicitly     )
  753. X2   constant PRB_NOCLI (  Don't create a CLI process                 )
  754. X(       PRB_INTERACTIVE 3L         This is now obsolete...                      )
  755. X4   constant PRB_CODE (  Dangerous yet enticing                      )
  756. X5   constant PRB_STDIO (  Do the stdio thing, splat = CON:Filename   )
  757. X
  758. X1  PRB_SAVEIO <<  constant PRF_SAVEIO
  759. X1  PRB_CLOSESPLAT <<  constant PRF_CLOSESPLAT
  760. X1  PRB_NOCLI <<  constant PRF_NOCLI
  761. X1  PRB_CODE <<    constant PRF_CODE
  762. X1  PRB_STDIO <<  constant PRF_STDIO
  763. X
  764. X( )
  765. X(  ************************************************************************)
  766. X(  *    Error returns from SyncRun[] and ASyncRun[]                     *)
  767. X(  ************************************************************************)
  768. X(  )
  769. X-1   constant PR_NOFILE (  Could not LoadSeg[] the file                      )
  770. X-2   constant PR_NOMEM (  No memory for something                    )
  771. X(       PR_NOCLI        -3L        This is now obsolete                         )
  772. X-4   constant PR_NOSLOT (  No room in TaskArray                              )
  773. X-5   constant PR_NOINPUT (  Could not open input file                        )
  774. X-6   constant PR_NOOUTPUT (  Could not get output file                       )
  775. X(       PR_NOLOCK       -7L        This is now obsolete                         )
  776. X(       PR_ARGERR       -8L        This is now obsolete                         )
  777. X(       PR_NOBCPL       -9L        This is now obsolete                         )
  778. X(       PR_BADLIB       -10L       This is now obsolete                         )
  779. X-11   constant PR_NOSTDIO (  Couldn't get stdio handles                      )
  780. X
  781. X( )
  782. X(  ************************************************************************)
  783. X(  *    Added V35 of arp.library                                        *)
  784. X(  ************************************************************************)
  785. X(  )
  786. X-12   constant PR_WANTSMESSAGE (  Child wants you to report IoErr[] to user  )
  787. X                (  for SyncRun[] only...                        )
  788. X-13   constant PR_NOSHELLPROC (  Can't create a shell/cli process            )
  789. X-14   constant PR_NOEXEC (  'E' bit is clear                         )
  790. X-15   constant PR_SCRIPT (  S and E are set, IoErr[] contains directory      )
  791. X
  792. X( )
  793. X(  ************************************************************************)
  794. X(  * Version 35 ASyncRun[] allows you to create an independent          *)
  795. X(  * interactive or background Shell/CLI. You need this variant of the  *)
  796. X(  * pcb structure to do it, and you also have new values for nsh_Control,*)
  797. X(  * see below.                                                         *)
  798. X(  *                                                                    *)
  799. X(  * Syntax for Interactive shell is:                                   *)
  800. X(  *                                                                    *)
  801. X(  * rc=ASyncRun["Optional Window Name","Optional From File",&NewShell];        *)
  802. X(  *                                                                    *)
  803. X(  * Syntax for a background shell is:                                  *)
  804. X(  *                                                                    *)
  805. X(  * rc=ASyncRun["Command line",0L,&NewShell];                          *)
  806. X(  *                                                                    *)
  807. X(  * Same syntax for an Execute style call, but you have to be on drugs *)
  808. X(  * if you want to do that.                                            *)
  809. X(  ************************************************************************)
  810. X(  )
  811. X
  812. X:STRUCT NewShell
  813. X              ULONG nsh_StackSize    (  stacksize shell will use for children        )
  814. X              BYTE nsh_Pri    (  ignored by interactive shells                )
  815. X              UBYTE nsh_Control    (  bits/values: see above                       )
  816. X\ %? correct below? -RM CPTR    nsh_LogMsg;    /* Optional login message, if null, use default */
  817. X              APTR nsh_LogMsg    (  Optional login message, if null, use default )
  818. X              LONG nsh_Input    (  ignored by interactive shells, but           )
  819. X              LONG nsh_Output    (  used by background and execute options.      )
  820. X            ( %?)   5 4 *  BYTES nsh_RESERVED
  821. X            ;STRUCT
  822. X
  823. X
  824. X( )
  825. X(  ************************************************************************)
  826. X(  * Bit Values for nsh_Control, you should use them as shown below, or *)
  827. X(  * just use the actual values indicated.                              *)
  828. X(  ************************************************************************)
  829. X(  )
  830. X0   constant PRB_CLI (  Do a CLI, not a shell        )
  831. X1   constant PRB_BACKGROUND (  Background shell              )
  832. X2   constant PRB_EXECUTE (  Do as EXECUTE...         )
  833. END_OF_FILE
  834. if test 41051 -ne `wc -c <'arp/ArpBase.j.aa'`; then
  835.     echo shar: \"'arp/ArpBase.j.aa'\" unpacked with wrong size!
  836. fi
  837. # end of 'arp/ArpBase.j.aa'
  838. fi
  839. echo shar: End of archive 2 \(of 2\).
  840. cp /dev/null ark2isdone
  841. MISSING=""
  842. for I in 1 2 ; do
  843.     if test ! -f ark${I}isdone ; then
  844.     MISSING="${MISSING} ${I}"
  845.     fi
  846. done
  847. if test "${MISSING}" = "" ; then
  848.     echo You have unpacked both archives.
  849.     rm -f ark[1-9]isdone
  850. else
  851.     echo You still need to unpack the following archives:
  852.     echo "        " ${MISSING}
  853. fi
  854. ##  End of shell archive.
  855. exit 0
  856. -- 
  857. Mail submissions (sources or binaries) to <amiga@cs.odu.edu>.
  858. Mail comments to the moderator at <amiga-request@cs.odu.edu>.
  859. Post requests for sources, and general discussion to comp.sys.amiga.
  860.